<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ES5-objec对象方法扩展</title>
</head>
<body>
    ES5 给Object扩展了一些静态方法
    1.Object.create(prototype,[descriptors]) //prototype 指定的是原型的位置
     
    * 作用：以指定对象为原型创建新的对象
    * 为新的对象指定新的属性，并对属性进行描述
       -value: 指定值
       - writable： 标识当前属性值是否是可修改的，默认为false
       - configurable: 标识当前属性是否可以被删除 默认为false
       - enmerable： 标识当前属性是否能用 for in 枚举 默认为false
   2. Object.defineProperties(Object,descriptors)
   * 作用：为指定对象定义扩展多个属性
   * get ： 用来获取当前属性值得回调函数
   * set ： 修改当前属性值得触发的回调函数，并且实参即为修改后的值
   * 存取器属性：setter，getter一个用来存值，一个用来取值
    <script>
    var obj = {
        userName:"lala",
        age:46,
    }
    var obj1 = {}
    // obj1 = Object.create(obj)
    // console.log(obj1)//给obj1增加了隐式原型
    obj1 = Object.create(obj,{
        sex:{
            value:'男',
           writable:true,
            configurable:true,
            //enumerable: true
        }
    })
    console.log(obj1)
    obj1.sex = "女";
    console.log(obj1.sex)
   // delete obj1.sex
    for(var key in obj1){
        console.log(key)
    }
    // Object.defineProperties(Object,descriptors)
    var obj2 = {firstName:'kobe',lastName:'brantss'}
    Object.defineProperties(obj2,{
        fullName: {
            get:function () { // 获取扩展属性的值,, 获取扩展属性值得时候，get方法自动调用
                return this.firstName + ' ' + this.lastName;
            },
            set:function(data){ //监听扩展属性，当扩展属性发生变化的时候调用
                console.log('set()'+data)
                var arr = data.split(' ')
                this.firstName = arr[0]
                this.lastName = arr[1]
                return this.firstName + ' ' + this.lastName
            }
        }
    })
    console.log(obj2)//惰性求值，有时候不会直接显示；
    console.log(obj2.fullName)
    obj2.fullName = "tim duncan"
    console.log(obj2.fullName)

    /*
        对象本身的两个方法
        get propertyName() 用来得到当前属性值得回调函数
        set propertyName() 用来监视当前属性值变化的回调函数
    */
    var obj3 = {
        firstName:'curry',
        lastName:'stephen',
        get fullName(){
            return this.firstName + ' '+ this.lastName
        },
        set fullName(data){
            var arr = data.split(" ")
            this.firstName = arr[0]
            this.lastName = arr[1]
        }
    }
    console.log(obj3)
    obj3.fullName = "tim denken"
    console.log(obj3.fullName)
        

    </script>
</body>
</html>